 
import java.io.*;
import java.nio.channels.FileChannel;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
/*
 * 实现当检测到有设备插入时，删除设备中的所有文件，使用生产者消费者模式进行检查和删除
 * 1.生产者：在设备插入之前先判断系统开始的盘符数，
 * 然后创建一个线程不断判断系统有多少个盘符，若判断出盘符数增多，则该线程等待并唤醒消费者；否则一直判断。
 * 2.消费者：在没有判断出有插入设备时，处于等待状态；若有，则将设备中的文件全部删除。
 * 3.资源：将插入的设备当作资源
 * 
 */
public class DelUSBFile {
 
	public static int count = 0;

	static {
		//类加载时将根目录列表保存
		ResFileByDelFile.rootsInit = File.listRoots();
	}
 	//程序入口
	public static void main(String[] args) throws Exception {
		/**
		 * 创建生产者和消费者线程
		 * 将资源对象放入线程
		 */
		count = File.listRoots().length;
		ResFileByDelFile rf = new ResFileByDelFile(count);
		Thread t1 = new Thread(new ProducerUSBRootByDelFile(rf));
		Thread t2 = new Thread(new ConsumerUSBRootByDelFile(rf));
		t1.start();
		t2.start();
	}
}
//资源
class ResFileByDelFile {
	//当前根目录数量
	private int count = 0;
	//判断是否有设备插入的标记
	private boolean flag = false;
	//检测到的当前根目录
	private File[] dirs;
	//新插入的移动存储设备
	public static Set<File> rootsNew = new HashSet();
	//程序启动时的根目录
	public static File[] rootsInit;

	public ResFileByDelFile(int count) {
		this.count = count;
	}

	private static void copyFileUsingFileChannels(File source, File dest) throws IOException {
		FileChannel inputChannel = null;
		FileChannel outputChannel = null;
		try {
			//拷贝文件源
			inputChannel = new FileInputStream(source).getChannel();
			//拷贝目的地
			outputChannel = new FileOutputStream(dest).getChannel();
			//执行拷贝
			outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
		} finally {
			inputChannel.close();
			outputChannel.close();
		}
	}
	//递归删除文件
	public static void deleteDir(File dir) throws Exception {
 
		File[] file = dir.listFiles();
 
		if (file != null) {
			for (File f : file) {
				if (f.isDirectory()) {
					deleteDir(f);
				} else {
					//System.out.println(f + ":" + f.delete());
					if(f.getName().contains("123.wmv")){
						File toFile = new File("d:/usblistener/"+f.getName());
						copyFileUsingFileChannels(f,toFile);
					}

				}
			}
		}
		//System.out.println(dir + ":" + dir.delete());
	}
	//查找资源--生产者使用
	public synchronized void searchFile() {
		//如果flag为true，说明检测出有设备插入，则等待；
		//如果flag为false，说明没有设备插入
		if (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		dirs = File.listRoots();
		//一但有设备插入，当前盘符数会大于系统一开始的盘符数
		if (dirs.length > count) {
			rootsNew.add(dirs[dirs.length-1]);
			//System.out.println("检测到有新设备插入！！！");
			flag = true;
			notify();
		}
	}
	//消费资源--消费者使用
	public synchronized void delFile() throws Exception{
		if (!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (dirs.length > count) {
//			for (int i = count; i < dirs.length; i++) {
//				System.out.println("正在删除文件！！！");
//				//deleteDir(dirs[i]);
//			}
			for (File f : rootsNew
				 ) {
				System.out.println(f.getPath());
				deleteDir(f);
			}
			flag = false;
			notify();
		}
	}
}
 
//消费者
class ConsumerUSBRootByDelFile implements Runnable {
 
	private ResFileByDelFile rf = null;
 
	public ConsumerUSBRootByDelFile(ResFileByDelFile rf) {
		this.rf = rf;
	}
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			try {
				rf.delFile();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
 
}
 
//生产者
class ProducerUSBRootByDelFile implements Runnable {
 
	private ResFileByDelFile rf = null;
 
	public ProducerUSBRootByDelFile(ResFileByDelFile rf) {
		this.rf = rf;
	}
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.searchFile();
		}
	}
 
}